# ++++++++++ 简介 +++++++++++ #
# 文件名: 事件管理器.py
# 说明: 这个类主要用于BaseSimulator. 当我们做promotion的时候,
# 通过这个类, 我们可以指定promotion操作延迟了多少个数据包.
# 赵宗义, xinshengzzy@foxmail.com, 2021.02.28
# -------------------- #
from collections import deque
from simulators.事件 import 事件


class 事件管理器:
    def __init__(self):
        self.包队列 = deque()
        self.事务队列 = deque()
        self.序号 = 0

    def 为空(self):
        if 0 == len(self.包队列) and 0 == len(self.事务队列):
            return True
        else:
            return False

    def 提取数据包数(self):
        return len(self.包队列)

    def 提取事务数(self):
        return len(self.事务队列)

    def 提取事件(self):
        tmp = None
        if 0 == len(self.包队列) and len(self.事务队列) > 0:
            tmp = self.事务队列.popleft()
        elif len(self.包队列) > 0 and 0 == len(self.事务队列):
            tmp = self.包队列.popleft()
        elif len(self.包队列) > 0 and len(self.事务队列) > 0:
            序号1 = self.包队列[0].提取序号()
            序号2 = self.事务队列[0].提取序号()
            if 序号1 < 序号2:
                tmp = self.包队列.popleft()
            else:
                tmp = self.事务队列.popleft()
        return tmp

    def 添加数据包(self, 数据包):
        临时 = 事件()
        临时.设为包类型()
        临时.设置数据包(数据包)
        临时.设置序号(self.序号)
        self.序号 += 1
        self.包队列.append(临时)

    def 添加事务(self, 临量):
        assert(isinstance(临量, 事件) and 临量.事务类型())
        self.事务队列.append(临量)
